home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / util / rexx / rxlistview15.lha / rxlistview / RXLISTVIEW.proc next >
Text File  |  1997-08-15  |  6KB  |  180 lines

  1. /*
  2. ** $VER: RXLISTVIEW.proc 1.5 (15.8.97) Rolf Rotvel
  3. **
  4. ** Usage: num = listview(width, height, titletext)
  5. **
  6. ** The stem variable, viewline, must have the following format:
  7. ** viewline.0 = number of elements
  8. ** viewline.1 = first element
  9. ** viewline.2 = second element...
  10. **
  11. ** Returns number of selected element or 0 if requester was cancelled.
  12. */ 
  13. RXLISTVIEW: procedure expose viewline. rxlv.
  14. parse arg argwidth, argheight, titletxt
  15.  
  16. /* Initialize when listview is opened for the first time */
  17. if rxlv.init? ~= 1 then call init_rxlistview(argwidth, argheight)
  18.  
  19. /* Create formatted stem variable for listview */
  20. do v = 1 to viewline.0
  21.     displine.v = left(viewline.v, rxlv.dispcols)
  22. end
  23. displine.0 = viewline.0
  24. /* Which is bigger - win rows or lines in stemvar? */
  25. if rxlv.disprows > displine.0 then rxlv.disprows = displine.0
  26.  
  27. /* Get current mouse coordinates */
  28. intui = showlist(l, 'intuition.library',, a)
  29. call forbid
  30. screen = next(intui, 56)                              /* IntuitionBase->ActiveScreen */
  31. mousex = c2d(import(offset(screen, 18), 2)) - 50      /* Screen->MouseX */
  32. mousey = c2d(import(offset(screen, 16), 2)) - 50      /* Screen->MouseY */
  33. call permit
  34.  
  35. /* Open the listview */
  36. call open('listwin', 'RAW:'||mousex||'/'||mousey||'/'||rxlv.width||'/'||rxlv.height||'/'||titletxt||'/NOSIZE', 'w')
  37. call writech('listwin', rxlv.nocursor||rxlv.nowordwrap)
  38.  
  39. /* Do ze stuff */
  40. row = 1 ; var = row 
  41. call writech('listwin', getlighty(row, var)||rxlv.nl||getpage(var + 1))
  42.  
  43. res = '' ; topvar = 1 
  44. do forever
  45.     oldrow = row ; oldvar = var
  46.     char = readch('listwin', 1)
  47.     select
  48.         when char = rxlv.csi then do
  49.             char = readch('listwin', 1)
  50.             select
  51.                 when char = rxlv.cursordown & oldvar ~= displine.0 then do
  52.                     line = getunlighty(oldrow, oldvar)
  53.                     var = var + 1
  54.                     if oldrow < rxlv.disprows then row = row + 1 
  55.                     else do
  56.                         line = line||rxlv.nl
  57.                         row = rxlv.disprows
  58.                         topvar = topvar + 1
  59.                     end
  60.                     call writech('listwin', line||getlighty(row, var))
  61.                 end  
  62.                 when char = rxlv.cursorup & oldvar ~= 1 then do
  63.                     line = getunlighty(oldrow, oldvar)
  64.                     var = var - 1
  65.                     if oldrow ~= 1 then do
  66.                         row = row - 1
  67.                         call writech('listwin', line||getlighty(row, var))
  68.                     end
  69.                     else do
  70.                         row = 1 
  71.                         topvar = topvar - 1
  72.                         call writech('listwin', line||getlighty(row, var)||rxlv.nl||getpage(var + 1))
  73.                     end            
  74.                 end
  75.                 when char = rxlv.scursorup & oldvar ~= 1 then do
  76.                     row = 1
  77.                     if oldrow = 1 then do
  78.                         if oldvar - rxlv.disprows < 1 then topvar = 1
  79.                         else topvar = oldvar - rxlv.disprows
  80.                         var = topvar
  81.                         call writech('listwin', rxlv.cls||getlighty(row, var)||rxlv.nl||getpage(topvar + 1))
  82.                     end
  83.                     else do
  84.                         var = topvar 
  85.                         call writech('listwin', getunlighty(oldrow, oldvar)||getlighty(row, var))
  86.                     end                
  87.                 end
  88.                 when char = rxlv.scursordown & oldvar ~= displine.0 then do
  89.                     row = rxlv.disprows
  90.                     if oldrow = rxlv.disprows then do
  91.                         if oldvar + rxlv.disprows > displine.0 then topvar = displine.0 - (rxlv.disprows - 1)
  92.                         else topvar = oldvar + 1
  93.                         var = min(displine.0, topvar + (rxlv.disprows - 1))
  94.                         call writech('listwin', rxlv.cls||getpage(topvar)||rxlv.nl||getlighty(row, var))
  95.                     end
  96.                     else do
  97.                         var = (topvar + rxlv.disprows) - 1
  98.                         call writech('listwin', getunlighty(oldrow, oldvar)||getlighty(row, var))
  99.                     end
  100.                 end
  101.                 otherwise nop
  102.             end
  103.         end
  104.         when char = rxlv.esc then do
  105.             call close('listwin')
  106.             return 0
  107.         end
  108.         when char = rxlv.cr then do
  109.             call close('listwin')
  110.             return oldvar
  111.         end
  112.         otherwise nop
  113.     end
  114. end
  115.  
  116. GETPAGE: procedure expose displine. rxlv.
  117. parse arg topvar
  118. if displine.0 = 1 then return ''
  119. page = ''
  120. do y = 1 to rxlv.disprows - 2                   /* Lines between first and last */
  121.     page = page||displine.topvar||rxlv.nl
  122.     topvar = topvar + 1
  123. end 
  124. page = page||displine.topvar                    /* No newline after last line */
  125. return page
  126.  
  127. GETUNLIGHTY: procedure expose rxlv. displine. 
  128. parse arg row, var .
  129. return rxlv.csi||row||';1H'||displine.var
  130.  
  131. GETLIGHTY: procedure expose rxlv. displine. 
  132. parse arg row, var .
  133. return rxlv.csi||row||';1H'||rxlv.hilite||displine.var||rxlv.off
  134.  
  135. INIT_RXLISTVIEW: procedure expose rxlv.
  136. /* Hardcoded minimum values */
  137. rxlv.width = max(100, arg(1))
  138. rxlv.height = max(50, arg(2))
  139.  
  140. /* ANSI stuff */
  141. rxlv.csi = '9b'x ; rxlv.esc = '1b'x
  142. rxlv.nl = '0a'x  ; rxlv.cr = '0d'x
  143. rxlv.off = rxlv.csi||'0m' 
  144. rxlv.topleft = rxlv.csi||'48'x 
  145. rxlv.cls = rxlv.csi||'H'||rxlv.csi'J'
  146. rxlv.hilite = rxlv.csi||'43;32m'
  147. rxlv.nowordwrap = rxlv.csi||'3f376c'x
  148. rxlv.nocursor = rxlv.csi||'302070'x 
  149. rxlv.cursorup = '41'x  ; rxlv.cursordown = '42'x 
  150. rxlv.scursorup = '54'x ; rxlv.scursordown = '53'x
  151.  
  152. /* GUI constants */
  153. guiheight = 7 ; guiwidth = 8
  154.  
  155. /* Font info */
  156. intui = showlist(l, 'intuition.library',, a)
  157. call forbid
  158. screen = next(intui, 56)                        /* IntuitionBase->ActiveScreen */
  159. font = next(screen, 136)                        /* Screen->RastPort.Font */
  160. fonty = c2d(import(offset(font, 20), 2))   /* Font->YSize */
  161. fontx = c2d(import(offset(font, 24), 2))   /* Font->XSize */
  162. call permit
  163.  
  164. /* Listview width */
  165. do while (rxlv.width - guiwidth) // fontx ~= 0 
  166.     rxlv.width = rxlv.width + 1 
  167. end
  168. rxlv.dispcols = ((rxlv.width - guiwidth) % fontx)
  169.  
  170. /* Listview height */
  171. const = guiheight + fonty
  172. do while (rxlv.height - const) // fonty ~= 0 
  173.     rxlv.height = rxlv.height + 1 
  174. end
  175. rxlv.disprows = (rxlv.height - const) % fonty
  176.  
  177. /* We only need to do all this once */
  178. rxlv.init? = 1
  179. return
  180.